home *** CD-ROM | disk | FTP | other *** search
/ User's Choice Windows CD / User's Choice Windows CD (CMS Software)(1993).iso / win_m_p / pwez51.zip / SCRLISAM.BAS < prev    next >
BASIC Source File  |  1992-04-01  |  24KB  |  554 lines

  1. '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  2. '!!!        ** [ READ THIS ] ** !!!!!!!! ** [ READ THIS ] **             !!!
  3. '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  4. ' DATA FILE, ISAMDATA.DAT REQUIRED FOR THIS PROGRAM -- SEE SCRLFILE.DOC
  5. '***************************************************************************
  6. '**   THIS PROGRAM MUST BE USED WITH ONE OF THE FOLLOWING LIBRARIES:      **
  7. '***************************************************************************
  8. '**   For QB4.+ unenhanced version use QB4UNEN.QLB                        **
  9. '**   For BASIC 7.+ unenhanced version use PDSUNEN.QLB                    **
  10. '**   For QB4.50 enhanced version use QBALL45.QLB or QBNER45.QLB          **
  11. '**   For QB4.00/4.00b enhanced version use QBALL40.QLB or QBNER40.QLB    **
  12. '**   For BASIC 7.0 enhanced version use PDSALL70.QLB or PDSNER70.QLB     **
  13. '**   For BASIC 7.1 enhanced version use PDSALL71.QLB or PDSNER71.QLB     **
  14. '**   Load QB or QBX with the /L option using the correct library         **
  15. '***************************************************************************
  16. '                              INSTRUCTIONS
  17. '                              ------------
  18. '   1. TSR, PROISAM, MUST BE LOADED BEFORE ATTEMPTING TO RUN THIS
  19. '      PROGRAM. WITH PROISAM.EXE AVAILABLE, TYPE: PROISAM - AT THE DOS PROMPT.
  20. '   2. MAKE SURE THE DATA FILE, ISAMDATA.DAT, IS IN THE DEFAULT
  21. '      DRIVE/DIRECTORY.  IF IT IS NOT AVAILABLE IT CAN BE MADE USING
  22. '      MAKEISAM.BAS ( SEE SCRLFILE.DOC ).
  23. '   3. LOAD QUICKBASIC OR PDS WITH THE CORRECT LIBRARY. ( SEE ABOVE )
  24. '   4. LOAD SCRLISAM.BAS ( THIS FILE ) INTO QB OR QBX.
  25. '   5. RUN THE PROGRAM. ( SHIFT F5 )
  26. '
  27. '          **** SEE SCRLFILE.DOC FOR ADDITIONAL INFORMATION ****
  28. '***************************************************************************
  29. '          ***** NOT FOR USE WITH QB 4+ WITHOUT ISAM *****
  30. '---------------------------------------------------------------------------
  31. TYPE REC
  32.   MARK AS STRING * 1
  33.   NAM AS STRING * 25
  34.   ADD1 AS STRING * 30
  35.   CITY AS STRING * 25
  36.   STATE AS STRING * 10
  37.   ZIP AS STRING * 9
  38. END TYPE
  39.  
  40. DIM RECORD AS REC
  41. DIM OLDRECORD AS REC
  42.  
  43. COLOR 0, 7: CLS
  44.  
  45. CALL SETWIND(1, 1, 0)              ' INITIALIZE WINDOW MEMORY.
  46. CALL INPTINIT(1, 1, "")            ' INITIALIZE INPUT MEMORY.
  47. CALL SETSCRL(1, 0, 15)             ' HI-INTENSITY TAG CHARACTER.
  48.  
  49. DO
  50.   ANS$ = ""
  51.   CALL GETANS("Color or Mono (C/M) ?", "CM", ANS$, 100, 100, 143, 11)
  52.   IF ANS$ = "C" THEN COL% = 23 ELSE COL% = 112
  53. LOOP WHILE ANS$ = CHR$(27)
  54.  
  55. IF COL% = 23 THEN A% = 31 ELSE A% = 15
  56. CALL INFOLINE(25, 1, 80, A%)              ' TURN INFO-LINE ON.
  57. CALL MOUSEON(1)                           ' TURN THE MOUSE ON.
  58. CALL MBUTTONS(13, 27)                     ' RIGHT MOUSE BUTTON = ENTER
  59.                                           ' LEFT MOUSE BUTTON = ESC
  60. '---------------------------------------------------------------------------
  61. ' DESCRIPTION WINDOW
  62.  
  63.  CALL MAKEWIND(2, "@Virtual scroll window template - Using an ISAM data file", 2, 100, 74, 8, COL%, 111)
  64.  CALL PRINTW("         This scroll window scrolls through an ISAM table.  It holds 7", 1, 2)
  65.  CALL PRINTW("records at a time.   This eliminates the need to place the entire file", 2, 2)
  66.  CALL PRINTW("in memory, minimizing precious string space usage.   This template may", 3, 2)
  67.  CALL PRINTW("be used many other type data files with slight modification.", 4, 2)
  68. '---------------------------------------------------------------------------
  69.  
  70. ' MAKE THE WINDOW TO BE USED AS THE SCROLL WINDOW.
  71. ' INITIALIZE VARIABLES
  72.  
  73. '---------------------------------------------------------------------------
  74.  
  75.   RTRN% = 1                ' SCROLL BAR OVER 1ST ENTRY.
  76.   ROWS% = 7                ' INTERIOR ROWS IN SCROLL WINDOW.
  77.                            ' IF WINDOW HAS A TITLE BOX ROWS% = NUMBER OF
  78.                            ' WINDOW ROWS - 4 ELSE ROWS% = NUMBER OF WINDOW
  79.                            ' ROWS - 2.
  80.   DIM A$(ROWS%)            ' DIMENSION ARRAY TO HOLD SCROLL WINDOW ENTRIES.
  81.   FC% = 1                  ' THE FIRST CHARACTER FOR ENTRIES IN SCROLL WINDOW
  82.                            ' PRINTS IN THE FIRST COLUMN IN THE WINDOW.
  83.                            ' WITH VIRTUAL SCROLL WINDOWS THE CHARACTER IN THE
  84.                            ' 1st COLUMN IS NOT ALWAYS THE 1st CHARACTER.
  85.   FILENUM% = 1             ' FILE NUMBER
  86.   DATAFILE$ = "ISAMDATA.DAT"   ' PREVIOUSLY CREATED ISAM FILE NAME
  87.   TABLENAME$ = "ALLDATA"       ' PREVIOUSLY CREATED ISAM TABLE
  88.   INDEXNAME$ = "NAME"          ' PREVIOUSLY CREATED ISAM INDEX
  89.   DIM DUMMY$(0)               ' SCROLL WINDOW REQUIRES FOR INFOLINE
  90.  
  91.    CALL MAKEWIND(20, "", 12, 4, 74, ROWS% + 4, COL%, 111)  ' FOR SCROLL WINDOW.
  92.    CALL NEWCOLOR(15)
  93.    CALL PRINTW("[ <ENTER>=Select <F1>=Find <ESC>=Quit <DEL>=Delete <+/->=Mark/un-mark ]", ROWS% + 1, 100)
  94.    CALL NEWCOLOR(COL%)
  95.    ' SCROLL WINDOW'S TITLE
  96.    TITLE$ = "NAME                     ADDRESS                       CITY                     STATE     ZIP"
  97.  
  98.    OPEN "ISAMDATA.DAT" FOR ISAM REC TABLENAME$ AS 1  ' OPEN THE ISAM FILE
  99.    SETINDEX FILENUM%, INDEXNAME$                     ' SET THE INDEX
  100. '---------------------------------------------------------------------------
  101.   'GET RECORDS FOR FIRST SCROLL WINDOW
  102.  
  103.   MOVEFIRST FILENUM%                                 ' START AT RECORD 1
  104.   GOSUB GETRECORDS                                   ' GET RECORDS
  105.  
  106. ' ---------------------------------------------------------------------------
  107.  ' PRINT THE INSTRUCTIONS AND PLACE THE RECORDS IN THE SCROLL WINDOW.
  108.  
  109. MAKESCRL:
  110.  
  111.   CALL INFOFIXED("     Up/Down/Left/Right -- Pgup/Pgdn -- Home/End -- Tab/Shift Tab -- Mouse")
  112.   KIND$ = ""         ' THIS IS A "REGULAR SCROLL WINDOW.
  113.  
  114.   CALL B4SCRL("DERX1", SCROLLMARK$)      ' SET EXIT CRITERA , NO MARKED ITEMS
  115.  
  116.   ' ENTER THE SCROLL WINDOW
  117.   KIND$ = "M"
  118.   CALL SCRLWIND(A$(), DUMMY$(), TITLE$, ENTRIES%, KIND$, RTRN%, LI%, FC%, RK%, 0)
  119.  
  120.   CALL INFOFIXED("")                  ' ERASE THE FIXED INFO STRING.
  121.   IF KIND$ = "" THEN KIND$ = SPACE$(ENTRIES%)
  122. '----------------------------------------------------------------------------
  123.  SELECT CASE RK%              ' RK% = EXIT KEY OR CIRCUMSTANCE CAUSING EXIT
  124.  
  125. '----------------------------------------------------------------------------
  126. ' THE DELETE KEY CAUSED THE EXIT -- DELETE A RECORD
  127.  
  128.     CASE 45
  129.       CALL PRINTINFO(" Press Y to delete the highlighted entry or N to abort deletion.")
  130.       ANS$ = ""
  131.       CALL GETANS("Delete this entry. Are you sure (Y/N)", "YN", ANS$, 11, 100, 15, 11)
  132.       IF ANS$ = "Y" THEN
  133.         IF ONLAST% = 0 THEN                      ' IF CURRENT RECORD IS
  134.            FOR X% = 1 TO ENTRIES% - 1            ' FIRST ENTRY IN THE SCROLL
  135.               MOVENEXT FILENUM%                  ' WINDOW MOVE IT TO THE
  136.            NEXT                                  ' LAST ENTRY.
  137.            ONLAST% = 1
  138.         END IF
  139.  
  140.         ' IS IT THE LAST SCROLL WINDOW ( LAST RECORD = LAST ENTRY )
  141.  
  142.         MOVENEXT FILENUM%
  143.         IF EOF(FILENUM%) THEN PASTEND% = 1 ELSE PASTEND% = 0
  144.         MOVEPREVIOUS FILENUM%
  145.  
  146.         IF ONLAST% = 1 THEN             ' MOVE CURRENT RECORD TO FIRST RECORD
  147.            GOSUB MOVE.TO.START          ' IN THE SCROLL WINDOW
  148.         END IF
  149.  
  150.         ' IS IT THE FIRST SCROLL WINDOW ( RECORD #1 = FIRST ENTRY )
  151.  
  152.         MOVEPREVIOUS FILENUM%
  153.         IF BOF(FILENUM%) THEN PASTSTART% = 1 ELSE PASTSTART% = 0
  154.         MOVENEXT FILENUM%
  155.  
  156.         ' MOVE TO SELECTED RECORD, DELETE IT AND UPDATE ISAM FILE
  157.  
  158.         FOR X% = 1 TO RTRN% - 1
  159.           MOVENEXT FILENUM%
  160.         NEXT
  161.         DELETE FILENUM%
  162.         CHECKPOINT
  163.  
  164.         IF PASTSTART% = 1 AND PASTEND% = 1 THEN
  165.            ' ( ALL RECORDS FIT IN ONE WINDOW )
  166.            MOVEFIRST FILENUM%
  167.            IF RTRN% = ENTRIES% THEN RTRN% = RTRN% - 1
  168.            CALL LINEW(ENTRIES%, 0)
  169.         ELSE
  170.            FOR X% = 1 TO RTRN% - 1
  171.               ' ( MOVE BACK TO FIRST RECORD IN THE SCROLL WINDOW )
  172.               MOVEPREVIOUS FILENUM%
  173.            NEXT
  174.            IF PASTSTART% = 0 AND PASTEND% = 1 THEN
  175.               ' ( THIS IS THE LAST SCROLL WINDOW - MOVE TO PREVIOUS RECORD )
  176.               MOVEPREVIOUS FILENUM%
  177.            END IF
  178.         END IF
  179.  
  180.         ' DECREMENT NUMBER OF RECORDS AND DISPLAY SAME.
  181.  
  182.         GOSUB GETRECORDS
  183.       END IF
  184.  
  185. '---------------------------------------------------------------------------
  186.  ' THE ENTER KEY CAUSED THE EXIT ---- AN ENTRY WAS SELECTED.
  187.  ' SELECTION IS A$(RTRN%).  THIS METHOD GETS SELECTION FROM ISAM FILE.
  188.  ' SELECTION COULD BE UPDATED HERE WITH ROUTINE "MULTINPT".
  189.  
  190.    CASE 13
  191.      CALL PRINTINFO(" Press any key....")
  192.      IF ONLAST% = 1 THEN               ' MOVE CURRENT RECORD TO FIRST RECORD
  193.        GOSUB MOVE.TO.START             ' IN THE SCROLL WINDOW
  194.      END IF
  195.  
  196.      ' MOVE TO SELECTED RECORD NUMBER.
  197.  
  198.      FOR X% = 1 TO RTRN% - 1: MOVENEXT FILENUM%: NEXT
  199.  
  200.      RETRIEVE FILENUM%, OLDRECORD
  201.      RETRIEVE FILENUM%, RECORD
  202.  
  203.      '----------------------------------------------------------------------
  204.      ' EDIT RECORD HERE
  205.  
  206.      CALL MAKEWIND(4, "@Selection = " + RTRIM$(RECORD.NAM) + "...", 6, 100, 42, 8, 15, 111)
  207.      CALL PRINTW("Using WINDOW R-E-Z's routine MULTINPT,", 1, 2)
  208.      CALL PRINTW("the selected record could be edited at", 2, 2)
  209.      CALL PRINTW("this point in the program. See remarks", 3, 2)
  210.      CALL PRINTW("in the source code.", 4, 2)
  211.      ANS$ = ""
  212.      CALL GETANS("[ Press any key... ]", "", "", 13, 100, 143, 0)
  213.      CALL RSTRWIND(4, 1): CALL CHNGWIND(20)
  214.      ' ---------------------------------------------------------------------
  215.  
  216.      GOSUB COMPAREIT
  217.      IF COMPARE% = 1 THEN                ' NOTHING CHANGED.
  218.         FOR X% = 1 TO RTRN% - 1          ' SET CURRENT RECORD BACK TO
  219.             MOVEPREVIOUS FILENUM%        ' SAME POSITION BEFORE EDIT.
  220.         NEXT
  221.      ELSE
  222.         UPDATE FILENUM%, RECORD          ' UPDATE THE ISAM TABLE
  223.         SEEKEQ FILENUM%, RECORD.NAM      ' GET FIRST MATCH FOR EDITED RECORD.
  224.         DO                               ' FIND EXACT MATCH FOR ALL FIELDS.
  225.            RETRIEVE FILENUM%, OLDRECORD
  226.            GOSUB COMPAREIT
  227.            IF COMPARE% = 1 THEN EXIT DO  ' ALL FIELDS MATCH. CUURENT RECORD
  228.            MOVENEXT FILENUM%             ' IS ON EDITED RECORD.
  229.         LOOP
  230.         GOSUB FOUNDRECORD                 ' PUT RECORD AT POSITION "RTRN%" IN
  231.                                           ' SCROLL WINDOW. (IF POSSIBLE.)
  232.      END IF
  233. '---------------------------------------------------------------------------
  234.  
  235.    CASE 30                                 ' HOME
  236.       MOVEPREVIOUS FILENUM%
  237.       IF LI% = 1 AND BOF(1) THEN           ' IS SCROLL BAR IS FIRST RECORD?
  238.          CALL DOSOUND
  239.       ELSE
  240.          IF ENTRIES% = ROWS% THEN
  241.          MOVEFIRST FILENUM%              ' MAKE CURRENT RECORD = 1ST RECORD
  242.             GOSUB GETRECORDS             ' GET NEW RECORDS FOR SCROLL WINDOW.
  243.          END IF
  244.       END IF
  245.       MOVEFIRST FILENUM%: ONLAST% = 0
  246.       FC% = 1                              ' FIRST CHARACTER = 1.
  247.       RTRN% = 1                            ' PLACE SCROLL BAR ON 1ST ENTRY
  248.  
  249. '---------------------------------------------------------------------------
  250.    CASE 35                                       ' END
  251.       MOVENEXT FILENUM%
  252.       IF LI% = ENTRIES% AND EOF(FILENUM%) THEN   ' IS SCROLL BAR ON LAST
  253.          CALL DOSOUND                            ' RECORD?
  254.       ELSE
  255.          IF ENTRIES% = ROWS% THEN                ' SET CURRENT RECORD TO
  256.               MOVELAST FILENUM%                  ' CORRECT RECCORD.
  257.               FOR X% = 1 TO ROWS% - 1            ' ( LAST RECORD - ROWS%+1 )
  258.                  WHILE INKEY$ <> "": WEND        ' CLEAR KEYBOARD
  259.                  MOVEPREVIOUS FILENUM%
  260.               NEXT
  261.               GOSUB GETRECORDS                  ' GET NEW RECORDS.
  262.          END IF
  263.       END IF
  264.       MOVELAST FILENUM%: ONLAST% = 1
  265.       FC% = 1
  266.       RTRN% = ENTRIES%                   ' PLACE SCROLL BAR ON LAST RECORD.
  267.  
  268. '---------------------------------------------------------------------------
  269. ' F1 KEY FOR "FIND" CAUSE ROUTINE SCRLWIND TO BE EXITED
  270.  
  271.    CASE 1                                       ' FIND
  272.       IF ONLAST% = 1 THEN                       ' MOVE CURRENT RECORD TO
  273.          GOSUB MOVE.TO.START                    ' 1ST ENTRY IN SCROLL WINDOW.
  274.          END IF
  275.       RTRN$ = ""
  276.       CALL PRINTW(STRING$(72, 196), ROWS% + 1, 100)
  277.       CALL PRINTINFO(" Enter the search critera.    ENTER accepts / ESC aborts.")
  278.       CALL MAKEWIND(3, "@Search for:", 9, 100, 22, 5, 240, 111)
  279.       FINDNAME$ = ""
  280.       DO
  281.         CALL DOSOUND
  282.         CALL INPTWIND("Enter A0 to Z9:", "U", 12, 100, 2, 1112, "QWERTYUIOPASDFGHJKLZXCVBNM0123456789", FINDNAME$, RKEY2%, 0)
  283.       LOOP WHILE FINDNAME$ = "" AND RKEY2% <> 27
  284.       CALL RSTRINPT(1)
  285.  
  286.       IF RKEY2% <> 27 THEN
  287.          FOR X% = 1 TO RTRN% - 1   ' MOVE CURRENT RECORD TO RECORD COVERED BY
  288.            MOVENEXT FILENUM%       ' SCROLL BAR WHEN F1 (FIND) WAS PRESSED.
  289.          NEXT
  290.          RETRIEVE FILENUM%, OLDRECORD   ' SAVE THAT RECORD IN OLDRECORD.
  291.       '----------------------------------------------------------------------
  292.       ' THIS COUNTS THE NUMBER OF RECORDS BEFORE THE CURRENT RECORD
  293.       ' THAT ARE A MATCH OF THE OLD CURRENT RECORD (IF ANY). THIS IS
  294.       ' NEEDED IF THE "FIND" FAILS SO THE SCROLL WINDOW CAN BE RE-ENTER
  295.       ' IN THE EXACT SPOT IT WAS BEFORE THE "FIND".  IT'S NOT REQUIRED FOR
  296.       ' THIS SAMPLE, BUT IS BE FOR OTHER DATA FILES THAT HAVE DUPLICATES.
  297.  
  298.          OFFSET% = 0
  299.          DO
  300.            MOVEPREVIOUS FILENUM%
  301.            IF BOF(FILENUM%) THEN MOVEFIRST FILENUM%: EXIT DO
  302.            RETRIEVE FILENUM%, RECORD
  303.            IF TEXTCOMP(RECORD.NAM, OLDRECORD.NAM) <> 0 THEN EXIT DO
  304.            OFFSET% = OFFSET% + 1
  305.          LOOP
  306.       ' ---------------------------------------------------------------------
  307.       ' SINCE THE SEEK IS "EQUAL TO OR GREATER THAN" TEXTCOMP CHECKS FOR
  308.       ' AN EXACT MATCH.  IF THERE IS NO EXACT MATCH OR END OF FILE IS
  309.       ' TRUE, FOUND% IS SET TO 0 ELSE FOUND% = 1.
  310.  
  311.          SEEKGE FILENUM%, FINDNAME$
  312.          IF NOT EOF(FILENUM%) THEN
  313.             RETRIEVE FILENUM%, RECORD
  314.             IF TEXTCOMP(FINDNAME$, LEFT$(RECORD.NAM, 2)) = 0 THEN
  315.                FOUND% = 1
  316.             ELSE
  317.                FOUND% = 0
  318.             END IF
  319.          ELSE
  320.             FOUND% = 0
  321.          END IF
  322.       '----------------------------------------------------------------------
  323.  
  324.          IF FOUND% = 0 THEN
  325.            CALL RSTRWIND(3, 1)
  326.            CALL GETANS("MATCH FOR -- " + FINDNAME$ + " -- NOT FOUND!  Press any key..", "", "", 100, 100, 143, 11)
  327.          '------------------------------------------------------------------
  328.          ' GO BACK TO THE OLD RECORD. ADJUST IF THERE WERE DUPLICATE RECORDS
  329.          ' OFFSET% HOLDS THE NUMBER OF DUPLICATES
  330.  
  331.            SEEKGE FILENUM%, OLDRECORD.NAM
  332.            RETRIEVE FILENUM%, RECORD
  333.            FOR X% = 1 TO OFFSET%: MOVENEXT FILENUM%: NEXT
  334.          '------------------------------------------------------------------
  335.          END IF
  336.          FC% = 1                         ' FOR VIRTUAL SCROLL WINDOWS.
  337.          GOSUB FOUNDRECORD
  338.  
  339.       END IF                          ' IF RKEY% <> 27
  340.  
  341.       CALL RSTRWIND(3, 1)             ' REMOVE "SEARCH FOR:" WINDOW
  342.       CALL CHNGWIND(20)               ' MAKE SCROLL WINDOW THE ACTIVE WINDOW.
  343.       CALL NEWCOLOR(15)
  344.       CALL PRINTW("[ <ENTER>=Select <F1>=Find <ESC>=Quit <DEL>=Delete <+/->=Mark/un-mark ]", ROWS% + 1, 100)
  345.       CALL NEWCOLOR(COL%)
  346. '----------------------------------------------------------------------------
  347.    ' SCRLWIND EXIT WAS CAUSED BY AN ATTEMPT TO MOVE BEFORE THE FIRST
  348.    ' ENTRY ( A$(START) ) IN THE SCROLL WINDOW.
  349.  
  350.    CASE 11, 16                 ' SCROLLING BEFORE START = UP ARROW OR PGUP
  351.        IF ONLAST% = 1 THEN
  352.          GOSUB MOVE.TO.START
  353.        END IF
  354.        MOVEPREVIOUS FILENUM%
  355.  
  356.        IF LI% = 1 AND BOF(FILENUM%) THEN             ' ALREADY ON 1ST RECORD
  357.          CALL DOSOUND: MOVENEXT FILENUM%
  358.        ELSE
  359.          IF ENTRIES% = ROWS% THEN
  360.             IF RK% = 11 THEN                           ' MUST BE PAGE UP
  361.                FOR X% = 1 TO ROWS% - 1
  362.                   MOVEPREVIOUS FILENUM%
  363.                   WHILE INKEY$ <> "": WEND             ' CLEAR KEYBOARD
  364.                NEXT
  365.                IF BOF(FILENUM%) THEN MOVEFIRST FILENUM%
  366.                GOSUB GETRECORDS
  367.             ELSE
  368.                FOR X% = ROWS% TO 2 STEP -1
  369.                   SWAP A$(X%), A$(X% - 1)
  370.                NEXT
  371.                RETRIEVE FILENUM%, RECORD
  372.                A$(1) = RECORD.NAM + RECORD.ADD1 + RECORD.CITY + RECORD.STATE + RECORD.ZIP
  373.                SCROLLMARK$ = RECORD.MARK + LEFT$(KIND$, ENTRIES% - 1)
  374.             END IF
  375.          END IF
  376.        END IF
  377.        LIN% = 1: RTRN% = 1
  378. ' ---------------------------------------------------------------------------
  379.  ' SCRLWIND EXIT WAS CAUSED BY ATTEMPT TO MOVE PAST THE END OF
  380.  ' THE SCROLL WINDOW ( A$(ENTRIES%) ).  PROGRAM ALSO MOVES HERE IF
  381.  ' Mark (+) /Un-mark (-)  WAS PRESSED ON THE LAST ENTRY IN THE SCROLL
  382.  ' WINDOW.
  383.  
  384.    CASE 12, 19                                  ' SCROLLING PAST THE END OF
  385.                                                 ' LIST.  DOWN ARROW OR PGUP.
  386. DOWN:
  387.        IF ONLAST% = 0 THEN                      ' IF FILE POSITION IS ON
  388.           FOR X% = 1 TO ENTRIES% - 1            ' FIRST ENTRY IN THE SCROLL
  389.              MOVENEXT FILENUM%                  ' WINDOW MOVE IT TO THE
  390.           NEXT                                  ' LAST ENTRY.
  391.           ONLAST% = 1
  392.        END IF
  393.        MOVENEXT FILENUM%     ' MOVE FILE POSITION TO RECORD AFTER LAST ENTRY
  394.  
  395.        IF LI% = ENTRIES% AND EOF(FILENUM%) THEN       ' END OF FILE?
  396.           CALL DOSOUND: MOVEPREVIOUS FILENUM%
  397.        ELSE                                           ' NOT EOF()
  398.           IF ENTRIES% = ROWS% THEN
  399.              IF RK% = 12 THEN                         ' PAGE DOWN
  400.                 FOR X% = 1 TO ROWS% - 1
  401.                    WHILE INKEY$ <> "": WEND           ' CLEAR KEYBOARD
  402.                    MOVENEXT FILENUM%
  403.                  NEXT
  404.                  IF EOF(FILENUM%) THEN MOVELAST FILENUM%
  405.                  FOR X% = 1 TO ROWS% - 1
  406.                      WHILE INKEY$ <> "": WEND           ' CLEAR KEYBOARD
  407.                      MOVEPREVIOUS FILENUM%
  408.                  NEXT
  409.                  GOSUB GETRECORDS
  410.              ELSE                                 ' MUST BE DOWN ARROW
  411.                 FOR X% = 1 TO ROWS% - 1
  412.                    SWAP A$(X%), A$(X% + 1)
  413.                 NEXT
  414.                 RETRIEVE FILENUM%, RECORD
  415.                 A$(ENTRIES%) = RECORD.NAM + RECORD.ADD1 + RECORD.CITY + RECORD.STATE + RECORD.ZIP
  416.                 SCROLLMARK$ = MID$(KIND$, 2) + RECORD.MARK
  417.              END IF
  418.           END IF
  419.        END IF
  420.        RTRN% = ENTRIES%
  421.  
  422.  CASE 50, 55
  423.    IF ONLAST% = 1 THEN          ' SET FILE POINTER TO 1ST RECORD
  424.       GOSUB MOVE.TO.START       ' IN THE SCROLL WINDOW.
  425.    END IF
  426.    FOR X% = 1 TO RTRN% - 1      ' SET FILE POINTER TO THE MARKED/UNMARKED
  427.       MOVENEXT FILENUM%         ' ENTRY IN THE SCROLL WINDOW
  428.    NEXT
  429.  
  430.    RETRIEVE FILENUM%, RECORD    ' GET THE RECORD
  431.  
  432.    IF RK% = 50 THEN             ' WAS MARK
  433.       RECORD.MARK = CHR$(16)    ' SET RECORD TO MARKED
  434.    ELSE                         ' WAS UN-MARK (RK%=55)
  435.       RECORD.MARK = " "         ' SET RECORD TO UN-MARKED
  436.    END IF
  437.  
  438.    UPDATE FILENUM%, RECORD      ' UPDATE THE RECORD
  439.    CHECKPOINT
  440.  
  441.    SCROLLMARK$ = KIND$          ' REFRESH SCROLLMARK$
  442.  
  443.    FOR X% = 1 TO RTRN% - 1      ' MOVE FILE POINTER BACK TO FIRST
  444.       MOVEPREVIOUS FILENUM%     ' RECORD IN SCROLL WINDOW.
  445.    NEXT
  446.    RTRN% = RTRN% + 1            ' ADVANCE TO NEXT ENTRY IN SCROLL WINDOW.
  447.    IF RTRN% > ENTRIES% THEN     ' ATTEMPT TO ADVANCE PAST END OF ENTRIES IN
  448.      RK% = 19: GOTO DOWN        ' IN SCROLL WINDOW. SIMULATE DOWN ARROW.
  449.    END IF
  450.  
  451.  CASE 27
  452.    CALL PRINTINFO(" Enter Y to quit or N to continue.  Press ENTER to accept your choice.")
  453.    ANS$ = "N"
  454.    CALL GETANS("Quit! (Y/N) ", "YN", ANS$, 13, 100, 1240, 11)
  455.    IF ANS$ = "Y" THEN CLOSE : CLS : END
  456.  END SELECT
  457.  
  458. GOTO MAKESCRL                  ' GO RE-ENTER SCROLL WINDOW
  459.  
  460. MOVE.TO.START:
  461.    FOR X% = 1 TO ENTRIES% - 1
  462.       WHILE INKEY$ <> "": WEND  ' NEED FOR SLOW MACHINES / LARGE ISAM TABLES
  463.       MOVEPREVIOUS FILENUM%
  464.    NEXT
  465.    ONLAST% = 0
  466. RETURN
  467.  
  468. '---------------------------------------------------------------------------
  469.  ' READ RECORDS FROM THE FILE. READ UNTIL MAXIMUM NUMBER OF ENTRIES
  470.  ' IN THE SCROLL WINDOWS ( ROWS% ) IS REACHED, OR UNTIL THE END
  471.  ' OF FILE ( EOF(FILENUM%) ) IS REACHED.
  472.  
  473. GETRECORDS:
  474.   SCROLLMARK$ = SPACE$(ROWS%)
  475.   ENTRIES% = 0                                   ' ENTRIES IN SCROLL WINDOW.
  476.   WHILE ENTRIES% < ROWS% AND NOT EOF(FILENUM%)
  477.     ENTRIES% = ENTRIES% + 1                      ' INCREMENT ENTRIES.
  478.     RETRIEVE FILENUM%, RECORD
  479.     MID$(SCROLLMARK$, ENTRIES%) = RECORD.MARK
  480.     MOVENEXT FILENUM%
  481.     A$(ENTRIES%) = RECORD.NAM + RECORD.ADD1 + RECORD.CITY + RECORD.STATE + RECORD.ZIP
  482.     WHILE INKEY$ <> "": WEND
  483.   WEND
  484.   MOVEPREVIOUS FILENUM%                      ' RESET FILE POSITION TO THE
  485.   ONLAST% = 1                                ' LAST RECORD IN THE SCROLL
  486.                                              ' WINDOW AND SET FLAG FOR SAME.
  487.   SCROLLMARK$ = LEFT$(SCROLLMARK$, ENTRIES%) ' NEED IF ENTRIES% < ROWS%
  488.  
  489. RETURN
  490. '----------------------------------------------------------------------------
  491. COMPAREIT:
  492.   COMPARE% = 1
  493.   IF RECORD.MARK <> OLDRECORD.MARK THEN COMPARE% = 0
  494.   IF RECORD.NAM <> OLDRECORD.NAM THEN COMPARE% = 0
  495.   IF RECORD.ADD1 <> OLDRECORD.ADD1 THEN COMPARE% = 0
  496.   IF RECORD.CITY <> OLDRECORD.CITY THEN COMPARE% = 0
  497.   IF RECORD.STATE <> OLDRECORD.STATE THEN COMPARE% = 0
  498.   IF RECORD.ZIP <> OLDRECORD.ZIP THEN COMPARE% = 0
  499. RETURN
  500.  
  501. FOUNDRECORD:
  502.   IF ENTRIES% = ROWS% THEN
  503.  
  504.     FOR X% = 1 TO RTRN% - 1             ' CHECK RECORDS
  505.        MOVEPREVIOUS FILENUM%            ' BEFORE FOUND
  506.        IF BOF(FILENUM%) THEN EXIT FOR   ' RECORD.
  507.     NEXT
  508.  
  509.     IF BOF(FILENUM%) THEN         ' FOUND RECORD IN 1ST SCROLL WINDOW.
  510.        MOVEFIRST FILENUM%         ' ADJUST SO 1ST RECORD = 1ST ENRTY IN
  511.        GOSUB GETRECORDS           ' IN WINDOW.  ADJUST RTRN% TO POINT
  512.        RTRN% = X%                 ' TO CORRECT ENTRY.
  513.        RETURN
  514.     END IF
  515.  
  516.     FOR X% = 1 TO RTRN% - 1      ' MOVE BACK TO "FOUND" RECORD
  517.       MOVENEXT FILENUM%
  518.     NEXT
  519.  
  520.     OFFSET% = 0
  521.     FOR X% = 1 TO (ROWS%) - (RTRN% - 1)  ' IS THE "FOUND" RECORD ONE
  522.        MOVENEXT FILENUM%                 ' OF THE LAST "ROWS%" OF
  523.        IF EOF(FILENUM%) THEN EXIT FOR    ' RECORDS?
  524.        OFFSET% = OFFSET% + 1
  525.     NEXT
  526.  
  527.     IF EOF(FILENUM%) THEN                ' IT IS ONE OF THE LAST
  528.        MOVELAST FILENUM%                 ' "ROWS%" OF RECORDS.
  529.        FOR X% = 1 TO ROWS% - 1           ' FILL SCROLL WINDOW WITH
  530.           MOVEPREVIOUS FILENUM%          ' LAST "ROWS%" OF RECORDS.
  531.           WHILE INKEY$ <> "": WEND       ' CLEAR KEYBOARD.
  532.        NEXT
  533.        GOSUB GETRECORDS
  534.        RTRN% = ROWS% - OFFSET%           ' ASJUST TO "FOUND" RECORD
  535.        RETURN                            ' RE-ENTER SCROLL WINDOW
  536.     END IF
  537.  
  538.     FOR X% = 1 TO ROWS%                  ' NOT 1ST "ROWS%" OF RECORDS
  539.        MOVEPREVIOUS FILENUM%             ' OR LAST "ROWS%" OF RECORDS.
  540.     NEXT
  541.     GOSUB GETRECORDS
  542.  
  543.   ELSE                                    ' LESS ENTRIES THAN ROWS.
  544.      FOR X% = 1 TO ROWS%                  ' FIND HOW MANY RECORDS ARE
  545.         MOVEPREVIOUS FILENUM%             ' BEFORE THE "FOUND" RECORD.
  546.         IF BOF(FILENUM%) THEN EXIT FOR
  547.      NEXT
  548.      MOVEFIRST FILENUM%
  549.      RTRN% = X%                           ' ADJUST RTRN% TO NUMBER OF
  550.      GOSUB GETRECORDS                     ' RECORDS BEFORE "FOUND" RECORD.
  551.   END IF
  552. RETURN
  553.  
  554.